#include <stdio.h>
#include <stdlib.h>
#include<limits.h>
#include "matriz.h"
#include "grafo.h"
#include "dijkstra.h"
#include "atlanticon.h"
#define inf INT_MAX

int* cenario1(Grafo* grafo){
    int aux, menorDistTotal=inf, soma=0;
    int* dist;
    int* pesosUnit;
    int* resultado;
    dist = (int*) malloc ((grafo->numVertices)*sizeof(int));
    pesosUnit = (int*) malloc (grafo->numVertices*sizeof(int));
    resultado = (int*) malloc (2*sizeof(int));

    for(aux = 0; aux < grafo->numVertices; aux++){
        pesosUnit[aux] = 1;
    }

    for(aux = 0; aux < grafo->numVertices; aux++){
        dijkstra(grafo, aux, dist);

        soma = somaDistancias(grafo->numVertices, dist, pesosUnit);
        if(soma < menorDistTotal){
            menorDistTotal = soma;
            resultado[0] = aux+1;
            resultado[1] = soma;
        }
    }
    free(dist);
    free(pesosUnit);

    return resultado;
}

int* cenario2(Grafo* grafo){
    int aux, menorDistTotal=inf, soma=0;
    int* dist;
    int* resultado;
    dist = (int*) malloc (grafo->numVertices*sizeof(int));
    resultado = (int*) malloc (2*sizeof(int));

    for(aux = 0; aux < grafo->numVertices; aux++){
        dijkstra(grafo, aux, dist);

        soma = somaDistancias(grafo->numVertices, dist, grafo->volPedidos);
        if(soma < menorDistTotal){
            menorDistTotal = soma;
            resultado[0] = aux+1;
            resultado[1] = soma;
        }
    }
    free(dist);

    return resultado;
}

int* cenario3(Grafo* grafo){
    int aux, menorPrazo=inf, maiorDist = 0, soma = 0;
    int* dist;
    int* pesosUnit;
    int* resultado;
    dist = (int*) malloc (grafo->numVertices*sizeof(int));
    pesosUnit = (int*) malloc (grafo->numVertices*sizeof(int));
    resultado = (int*) malloc (2*sizeof(int));

    for(aux = 0; aux < grafo->numVertices; aux++){
        pesosUnit[aux] = 1;
    }

    for(aux = 0; aux < grafo->numVertices; aux++){
        dijkstra(grafo, aux, dist);

        soma = somaDistancias(grafo->numVertices, dist, pesosUnit);

        maiorDist = maiorDistancia(grafo->numVertices, dist);

        if(maiorDist < menorPrazo){
            menorPrazo = maiorDist;
            resultado[0] = aux+1;
            resultado[1] = soma;
        }
    }
    free(dist);
    free(pesosUnit);

    return resultado;
}

float prejuizo(int* cen1, int* cen3){
    float resultado=0;

    resultado = (((float)cen3[1]*100)/ (float)cen1[1]) - 100;

    return resultado;
}

int somaDistancias(int tam, int* distancias, int* pesos){
    int aux=0, total=0;

     for(aux = 0; aux < tam; aux++){
        total = total + (distancias[aux] * pesos[aux]);
     }
     return total;
}

int maiorDistancia(int tam, int* distancias){
    int aux=0, total=0;

     for(aux = 0; aux < tam; aux++){
         if(distancias[aux]>total){
            total = distancias[aux];
         }
     }
     return total;
}
